package com.xtjc.recsyslog.netty.decoder;

import cn.hutool.core.util.ArrayUtil;
import com.xtjc.recsyslog.util.ConverUtil;
import com.xtjc.recsyslog.util.YunCrcUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Slf4j
public class CustomDataDecoder extends ByteToMessageDecoder {


    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) {
        // 打印当前缓冲区的内容
        int readableBytes = in.readableBytes();
        byte[] buffer = new byte[readableBytes];
        in.markReaderIndex();
        in.readBytes(buffer);
        log.info("接收到的10进制：{}",ArrayUtil.toString(buffer));
        log.info("接收到的16进制: {}", ArrayUtil.toString(ConverUtil.bytesToHexArray(buffer)));
        in.resetReaderIndex();
        while (in.isReadable()) {
            // 查找开始标志
            int startFlagIndex = in.bytesBefore((byte) 0x68);
            if (startFlagIndex == -1) {
                in.resetReaderIndex();
                break; // 没有找到开始标志，退出循环
            }
//            in.skipBytes(startFlagIndex + 1); // 跳过开始标志
            byte startByte = in.readByte();
            byte value = in.readByte();


            int dataLength = readableBytes - 4;
            log.info("数据包长度：{}",readableBytes);
            int length =  value & 0xFF;//多亏有了GPT
            if(dataLength < length){
                in.resetReaderIndex();
                break;
            }
            /**
             * 如果你希望将 A2 转换成 162 而不是 -94，你需要将 byte 类型的值视为无符号数。在 Java 中，byte 类型默认是有符号的，但你可以通过一些技巧将其视为无符号数。
             * 解决方案
             * 将 byte 转换为无符号整数。
             * 调整 ByteToMessageDecoder 以处理无符号 byte 值。
             * 1. 将 byte 转换为无符号整数
             * 在 Java 中，可以通过将 byte 类型的值与 0xFF 进行按位与操作来将其视为无符号数。
             * 2. 调整 ByteToMessageDecoder
             * 下面是一个示例代码，展示了如何在 ByteToMessageDecoder 中处理无符号 byte 值。
             */
            // 将 byte 类型的值转换为无符号整数
            // 读取消息体
            byte[] body = new byte[length]; // 减去开始标志的长度
            in.readBytes(body);
            byte[] crcData = YunCrcUtil.calculateCrc(body);
//            log.info("Crc : {}", crcData);
            byte lowByte = in.readByte();
            byte hiByte = in.readByte();
            if (hiByte == crcData[0] && lowByte == crcData[1]) {
//                log.info("crc校验通过");
                out.add(ConverUtil.bytesToHexArray(body));
//                out.add(HexUtil.encodeHex(body));
            } else {
                log.info("crc校验失败");
                // 没有找到结束标志，保存已读取的部分并等待更多数据
                in.resetReaderIndex();
                break;
            }
        }
    }
}
